package model

import (
	"fmt"
	"ginblog/utils/errormsg"
	"gorm.io/gorm"
)

type Article struct {
	gorm.Model
	//Category Category `gorm:"foreignKey:Cid"` // 属于哪个分类
	Category Category `gorm:"foreignKey:Cid;references:ID"`
	Title    string   `gorm:"type:varchar(100);not null" json:"title"`
	Cid      int      `gorm:"type:int;not null" json:"cid"`
	Desc     string   `gorm:"type:varchar(200)" json:"desc"`
	Content  string   `gorm:"type:longtext" json:"content"`
	Img      string   `gorm:"type:varchar(255)" json:"img"`
}

//var code int

// AddArticle 增加文章
func AddArticle(Art *Article) int {
	err := db.Create(Art).Error
	if err != nil {
		fmt.Println(err)
		return errormsg.ERROR
	}
	db.Preload("Category").First(Art, Art.ID)
	return errormsg.SUCCESS
}

// GetArt 查找文章列表
func GetArt(pageSize int, pageNum int) ([]Article, int, int64) {
	var articles []Article
	var total int64
	err := db.Preload("Category").Limit(pageSize).Offset((pageNum - 1) * pageSize).Find(&articles).Count(&total).Error
	//offset 里面的参数表示查询操作要调过的数据
	if err != nil {
		return nil, errormsg.ERROR, 0
	}
	return articles, errormsg.SUCCESS, total
}

// GetArtInfo 查找单个文章
func GetArtInfo(id int) (Article, int) {
	var article Article
	err := db.Preload("Category").Where("id = ?", id).First(&article).Error
	if err != nil {
		return article, errormsg.ERROR_ARTICLE_NOT_EXIST
	}
	return article, errormsg.SUCCESS
}

// GetCateArt 查找分类下的全部文章
func GetCateArt(cid int, pageSize int, pageNum int) ([]Article, int, int64) {
	var cateArticles []Article
	var total int64
	err := db.Preload("Category").Limit(pageSize).Offset((pageNum-1)*pageSize).Where("cid = ?", cid).Find(&cateArticles).Count(&total).Error
	if err != nil {
		return nil, errormsg.ERROR_CATE_NOT_EXIST, 0
	}
	return cateArticles, errormsg.SUCCESS, total
}

// DeleteArt 删除文章
func DeleteArt(id int) int {
	err := db.Where("id = ?", id).Delete(&Article{}).Error
	if err != nil {
		return errormsg.ERROR
	}
	return errormsg.SUCCESS
}

// UpdateArt 编辑文章
func UpdateArt(id int, data *Article) int {
	var art Article
	var maps = make(map[string]interface{})
	maps["title"] = data.Title
	maps["content"] = data.Content
	maps["cid"] = data.Cid
	maps["desc"] = data.Desc
	maps["img"] = data.Img

	err := db.Model(&art).Where("id = ?", id).Updates(maps).Error
	if err != nil {
		fmt.Println(err)
		return errormsg.ERROR
	}
	return errormsg.SUCCESS
}
